package netzwerk;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import model.Order;

/*
 * TCP Server - Überprüft Logindaten, nimmt Order entgegen und sendet 
 * Antwort an den Client
 */
public class Warehouse extends ServerSocket {

	private static Warehouse instance;
	private static WarehouseWorker worker;

	private Order orderTotal = new Order();
	Lock orderTotalLock = new ReentrantLock(true);

	public Warehouse() throws IOException {
		super();
		setReuseAddress(true);
		bind(new InetSocketAddress(6666));
	}

	public static Warehouse getInstance() {
		return instance;
	}

	public static void main(String[] args) {
		try {
			instance = new Warehouse();
			System.out.println("Warehouse ist verfügbar");
		} catch (IOException e) {
			System.err.println("Warehouse-Socket konnte nicht erstellt werden");
			e.printStackTrace();
		}

		while (true) {
			try {
				Socket clientCon = instance.accept(); // Wartet darauf, dass sich jemand verbindet
				clientCon.toString();
				worker = new WarehouseWorker(clientCon, instance, instance.orderTotalLock); // Bei eingehender Verbindung neuen Worker erstellen
				worker.start();
				System.out.println("Worker gestartet");
			} catch (IOException e) {
				System.err.println("Fehler beim Warten auf eingehende Verbindungen zum Warehouse.");
				e.printStackTrace();
			}

		}

	}

	public Order getOrderTotal() {
		return orderTotal;
	}

	public void setOrderTotal(Order orderTotal) {
		this.orderTotal = orderTotal;
	}

}
